home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / PEAR / PackageFileManager / Cvs.php next >
PHP Script  |  2004-10-01  |  7KB  |  176 lines

  1. <?php
  2. //
  3. // +------------------------------------------------------------------------+
  4. // | PEAR :: Package File Manager                                           |
  5. // +------------------------------------------------------------------------+
  6. // | Copyright (c) 2003-2004 Gregory Beaver                                 |
  7. // | Email         cellog@phpdoc.org                                        |
  8. // +------------------------------------------------------------------------+
  9. // | This source file is subject to version 3.00 of the PHP License,        |
  10. // | that is available at http://www.php.net/license/3_0.txt.               |
  11. // | If you did not receive a copy of the PHP license and are unable to     |
  12. // | obtain it through the world-wide-web, please send a note to            |
  13. // | license@php.net so we can mail you a copy immediately.                 |
  14. // +------------------------------------------------------------------------+
  15. // | Portions of this code based on phpDocumentor                           |
  16. // | Web           http://www.phpdoc.org                                    |
  17. // | Mirror        http://phpdocu.sourceforge.net/                          |
  18. // +------------------------------------------------------------------------+
  19. // $Id: Cvs.php,v 1.8 2004/02/07 06:33:31 cellog Exp $
  20. //
  21. /**
  22.  * @package PEAR_PackageFileManager
  23.  */
  24. /**
  25.  * The PEAR_PackageFileManager_File class
  26.  */
  27. require_once 'PEAR/PackageFileManager/File.php';
  28.  
  29. /**
  30.  * Generate a file list from a CVS checkout
  31.  *
  32.  * Note that this will <b>NOT</b> work on a
  33.  * repository, only on a checked out CVS module
  34.  * @package PEAR_PackageFileManager
  35.  */
  36. class PEAR_PackageFileManager_CVS extends PEAR_PackageFileManager_File {
  37.     /**
  38.      * List of CVS-specific files that may exist in CVS but should be
  39.      * ignored when building the package's file list.
  40.      * @var array
  41.      * @access private
  42.      */
  43.     var $_cvsIgnore = array('.cvsignore');
  44.  
  45.     /**
  46.      * Return a list of all files in the CVS repository
  47.      *
  48.      * This function is like {@link parent::dirList()} except
  49.      * that instead of retrieving a regular filelist, it first
  50.      * retrieves a listing of all the CVS/Entries files in
  51.      * $directory and all of the subdirectories.  Then, it
  52.      * reads the Entries file, and creates a listing of files
  53.      * that are a part of the CVS repository.  No check is
  54.      * made to see if they have been modified, but newly
  55.      * added or removed files are ignored.
  56.      * @return array list of files in a directory
  57.      * @param string $directory full path to the directory you want the list of
  58.      * @uses _recurDirList()
  59.      * @uses _readCVSEntries()
  60.      */
  61.     function dirList($directory)
  62.     {
  63.         static $in_recursion = false;
  64.         if (!$in_recursion) {
  65.             // include only CVS/Entries files
  66.             $this->_setupIgnore(array('*/CVS/Entries'), 0);
  67.             $this->_setupIgnore(array(), 1);
  68.             $in_recursion = true;
  69.             $entries = parent::dirList($directory);
  70.             $in_recursion = false;
  71.         } else {
  72.             return parent::dirList($directory);
  73.         }
  74.         if (!$entries || !is_array($entries)) {
  75.             return PEAR_PackageFileManager::raiseError(PEAR_PACKAGEFILEMANAGER_NOCVSENTRIES, $directory);
  76.         }
  77.         return $this->_readCVSEntries($entries);
  78.     }
  79.     
  80.     /**
  81.      * Iterate over the CVS Entries files, and retrieve every
  82.      * file in the repository
  83.      * @uses _getCVSEntries()
  84.      * @uses _isCVSFile()
  85.      * @param array array of full paths to CVS/Entries files
  86.      * @access private
  87.      */
  88.     function _readCVSEntries($entries)
  89.     {
  90.         $ret = array();
  91.         $ignore = array_merge($this->_options['ignore'], $this->_cvsIgnore);
  92.         // implicitly ignore packagefile
  93.         $ignore[] = $this->_options['packagefile'];
  94.         $include = $this->_options['include'];
  95.         $this->ignore = array(false, false);
  96.         $this->_setupIgnore($ignore, 1);
  97.         $this->_setupIgnore($include, 0);
  98.         foreach($entries as $cvsentry) {
  99.             $directory = @dirname(@dirname($cvsentry));
  100.             if (!$directory) {
  101.                 continue;
  102.             }
  103.             $d = $this->_getCVSEntries($cvsentry);
  104.             if (!is_array($d)) {
  105.                 continue;
  106.             }
  107.             foreach($d as $entry) {
  108.                 if ($ignore) {
  109.                     if ($this->_checkIgnore($this->_getCVSFileName($entry),
  110.                           $directory . '/' . $this->_getCVSFileName($entry), 1)) {
  111.     //                    print 'Ignoring '.$file."<br>\n";
  112.                         continue;
  113.                     }
  114.                 }
  115.                 if ($include) {
  116.                     if ($this->_checkIgnore($this->_getCVSFileName($entry),
  117.                           $directory . '/' . $this->_getCVSFileName($entry), 0)) {
  118.     //                    print 'Including '.$file."<br\n";
  119.                         continue;
  120.                     }
  121.                 }
  122.                 if ($this->_isCVSFile($entry)) {
  123.                     $ret[] = $directory . '/' . $this->_getCVSFileName($entry);
  124.                 }
  125.             }
  126.         }
  127.         return $ret;
  128.     }
  129.     
  130.     /**
  131.      * Retrieve the filename from an entry
  132.      *
  133.      * This method assumes that the entry is a file,
  134.      * use _isCVSFile() to verify before calling
  135.      * @param string a line in a CVS/Entries file
  136.      * @return string the filename (no path information)
  137.      * @access private
  138.      */
  139.     function _getCVSFileName($cvsentry)
  140.     {
  141.         $stuff = explode('/', $cvsentry);
  142.         array_shift($stuff);
  143.         return array_shift($stuff);
  144.     }
  145.     
  146.     /**
  147.      * Retrieve the entries in a CVS/Entries file
  148.      * @return array each line of the entries file, output of file()
  149.      * @uses function file()
  150.      * @param string full path to a CVS/Entries file
  151.      * @access private
  152.      */
  153.     function _getCVSEntries($cvsentryfilename)
  154.     {
  155.         $cvsfile = @file($cvsentryfilename);
  156.         if (is_array($cvsfile)) {
  157.             return $cvsfile;
  158.         } else {
  159.             return false;
  160.         }
  161.     }
  162.     
  163.     /**
  164.      * Check whether an entry is a file or a directory
  165.      * @return boolean
  166.      * @param string a line in a CVS/Entries file
  167.      * @access private
  168.      */
  169.     function _isCVSFile($cvsentry)
  170.     {
  171.         // make sure we ignore entries that have either been removed or added, but not committed yet
  172.         return $cvsentry{0} == '/' && !strpos($cvsentry, 'dummy timestamp');
  173.     }
  174. }
  175. ?>
  176.